# Разработка на Java. Практика (Переобучение ЦФТ, 2-й этап)

## Задание №4. Spring

__Данное задание включает несколько целей:__

1. Отработка навыка использования фреймворка внедрения зависимостей Spring
2. Отработка навыка разработки приложений на слабосвязных компонентах
3. Отработка навыка работы с базами данных из языка Java.

Задание состоит из двух частей. В первой части необходимо разработать приложение на базе фреймворка Spring, которое будет состоять из набора компонент, каждая из которых отвечает за свою часть логики системы, а их совокупность представляет собой все приложение. Обратите внимание, что все компоненты разработанной системы должны быть связаны, то есть они не могут знать о классах друг друга (но могут знать об именах или других настройках).

Первая часть задания предполагает чтение данных из файлов и запись данных в БД. Для работы с файлами могут быть использованы классы `File` и `Scanner`. Работа с базой данных выполняется стандартными средствами Spring JDBC, при этом конкретная выбранная СУБД не оказывает какого-либо влияния на характер выбранной работы.

Во второй части задания, необходимо разработать аннотацию и определить способ обработки. Вторая часть задания может быть решена даже без решения первой.

### Часть 1. Ядро системы

Дан набор текстовых документов, каждый из которых содержит одну или несколько записей о фактах авторизации пользователей в систему:

_Логин Фамилия Имя Отчество дата_входа тип_приложения_

Необходимо разработать приложение, которое будет получать на вход наименование папки, в которой расположены текстовые файлы, получать из файлов все значения и записывать их в базу данных со следующей схемой таблиц:
[pic-01.png](./res/5694b5b60e8e3315a34addd9926fdd53a4df1d61.png)

Приложение должно состоять из набора слабосвязных компонент, каждый из которых отвечает за собственную часть логики переноса данных, в частности должны быть разработаны следующие компоненты:

1) Компонент чтения данных из файлов
2) Компонент записи данных в БД
3) Промежуточные компоненты

В настоящий момент времени число и состав промежуточных компонент фиксировано, однако в дальнейшем может потребоваться создание дополнительных компонент. Система должна предоставлять такую архитектуру, которая позволит внедрить новые компоненты без необходимости внесения изменений в уже существующие, а также гибко настраивать порядок следования компонент.

#### Базовая реализация компонент включает следующее:

1) Компонента чтения данных получает адрес папки файловой системы, сканирует имеющиеся там файлы и возвращает прочитанные строки
2) Компонента записи данных получает строку подключения к базе, включая адрес, имя пользователя и пароль, а затем записывает данные из файлов в базу.
3) Промежуточная компонента проверки данных исправляет ФИО так, чтобы каждый его компонент начинался с большой буквы.
4) Промежуточная компонента проверяет что тип приложения соответствует одному из: “web”, “mobile”. Если там записано что-либо иное, то оно преобразуется к виду “other:”+значение.
5) Промежуточная компонента проверки даты проверяет её наличие. Если дата не задана, то человек не вносится в базу, а сведения о имени файла и значении человека заносятся в отдельный лог.

В задании требуется использовать подключение к базе данных с использованием какой-либо СУБД. Обратите внимания, что целевая СУБД данного курса — это PostgreSQL. Таким образом, желательно развернуть образ этой СУБД, возможно с использованием докер. Вместе с тем, конкретно для данного задания допустимо использование встраиваемых СУБД, например H2.

К решению необходимо приложить набор тестов для всех существенных частей. В данном задании тестированию подлежат не только отдельные компоненты и модули системы, но и их интеграция в единую систему.

### Часть 2. Логирование

Разработайте аннотацию `@LogTransformation`, которая может быть использована для аннотирования промежуточных компонент системы. Если промежуточный компонент имеет такую аннотацию, то после завершения выполнения операции в лог записывается дата-время начала операции, название класса компоненты, данные полученные на вход операции, данные возвращаемые в результате операции.

Название лог файла может быть указано в качестве параметра аннотации. 